package org.fuyd.algorithm.infact;

/**
 * 计算2048游戏的极限得分 注意：由于int类型最大值为2147483647,当超过4*4的方格时，不适用于使用int类型来进行计算 极限如下：
 * *****************************<br>
 * *131072* 65536* 32768* 16384*<br>
 * *****************************<br>
 * *  1024*  2048*  4096*  8192*<br>
 * *****************************<br>
 * *   512*   256*   128*    64*<br>
 * *****************************<br>
 * *     4*     8*     6*    32*<br>
 * *****************************<br>
 * 
 * @author 永德
 *
 */
public class Exercise2048 {
  public static void main(String[] args) {
    System.out.println(zongfen(4));
  }

  /**
   * 私有的无参构造方法
   */
  private Exercise2048() {
    super();
  }

  /**
   * 实例化一个Exercise2048类的对象
   */
  private static final Exercise2048 instance = new Exercise2048();

  /**
   * 供外部访问Exercise2048，饿汉单例模式，线程安全
   * 
   * @return 实例化一个Exercise2048类的对象
   */
  public Exercise2048 getInstance() {
    return instance;
  }

  /**
   * 计算总分
   * 
   * @param a 表示长度为a格的正方体
   * @return 总分
   */
  private static int zongfen(int a) {
    // 总格数
    int c = a * a;
    // 总分
    int sum = 0;
    // 计算每格需要的分数并相加
    for (int i = 1; i <= c; i++) {
      sum = sum + dange(i);
    }
    // 有c个格，则需要c个直接的4，所以需要减去c*4分
    return sum - c * 4;
  }

  /**
   * 计算单格所需的分数
   * 
   * @param b 第几个格
   * @return 第b个格所需的分数
   */
  private static int dange(int b) {
    return (int) Math.scalb(2, b) * b;
  }

}
